ヘッダーをスキップ
Oracle TimesTen In-Memory Database C開発者およびリファレンス・ガイド
リリース6.0
B25764-01
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

データ・ストアに対する接続および切断

TimesTenデータ・ストアにDSNを作成する方法の詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』を参照してください。作成するDSNのタイプは、アプリケーションでデータ・ストアに直接接続するか、クライアント接続によって接続するかによって異なります。データ・ストアに直接接続する場合は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のUNIXでのDSNの作成またはWindowsでのDSNの作成に関する項を参照してください。データ・ストアにクライアント接続する場合は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のWindowsでのクライアントDSNの作成および設定またはUNIXでのクライアントDSNの作成および設定に関する項を参照してください。

データ・ストアに接続するには、ODBC機能のSQLConnectまたはSQLDriverConnectをコールします。データ・ストアから切断するには、ODBC機能のSQLDisconnectをコールします。これらの機能の詳細は、『Microsoft ODBC Programmer's Reference and SDK Guide』を参照してください。

例1.1のコード・フラグメントでは、SQLConnectおよびSQLDisconnectを起動して、FixedDsというデータ・ストアに対する接続および切断を行います。アプリケーションではじめてSQLConnectを起動すると、データ・ストアFixedDsが作成されます。その後SQLConnectを起動すると、既存のデータ・ストアに接続されます。

例1.1
#include <sql.h> 
SQLRETURN   retcode; 
SQLHDBC     hdbc; 
...; 
retcode = SQLConnect(hdbc, 
                     (SQLCHAR*)"FixedDs", SQL_NTS, 
                     (SQLCHAR*)"", SQL_NTS, 
                     (SQLCHAR*)"", SQL_NTS); 
...; 
retcode = SQLDisconnect(hdbc); 
...; 
例1.2

この例には、データ・ストアを作成し、データ・ストアに対して接続および切断を行う完全なプログラムが含まれています。この例では、SQLConnectではなく、SQLDriverConnectを使用して接続を設定します。また、エラー・メッセージの取得方法についても示します。

#ifdef WIN32 
#include <windows.h> 
#else 
#include <sqlunix.h> 
#endif 
#include <sql.h> 
#include <sqlext.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
void CheckReturnCode(SQLRETURN rc, SQLHENV henv, 
                SQLHDBC hdbc, SQLHSTMT hstmt, 
                char* msg, char *filename, 
                int lineno); 
void main( void ) 
{ 
  SQLRETURN   rc      = SQL_SUCCESS; 
            /* General return code for the API */ 
  SQLHENV     hEnv    = SQL_NULL_HENV; 
                         /* Environment handle */ 
  SQLHDBC     hDbc    = SQL_NULL_HDBC; 
                         /* Connection handle  */ 
  SQLHSTMT    hStmt  = SQL_NULL_HSTMT; 
                         /* Statement handle   */ 
  SQLCHAR     ConnOut[255]; 
     /* Buffer for completed connection string */ 
  SQLSMALLINT connOutLen; 
     /* number of bytes returned in ConnOut */ 
  SQLCHAR     *ConnString = (SQLCHAR *)
                "DSN=OperationalDS;PermSize=1;" 
                     /* Connection attributes */ 
  rc = SQLAllocEnv(&hEnv); 
  if (rc != SQL_SUCCESS) { 
    fprintf(stderr,"Unable to allocate an "
                   "environment handle\n"); 
    exit(1); 
  } 
  rc = SQLAllocConnect(hEnv, &hDbc); 
  CheckReturnCode(rc, hEnv, SQL_NULL_HDBC, 
                  SQL_NULL_HSTMT, 
                  "Unable to allocate a " 
                  "connection handle\n",
                  __FILE__, __LINE__); 
  rc = SQLDriverConnect(hDbc, NULL, 
                        ConnString, SQL_NTS, 
                        ConnOut, 255, 
                        &connOutLen, 
                        SQL_DRIVER_NOPROMPT); 
  CheckReturnCode(rc, hEnv, hDbc, SQL_NULL_HSTMT, 
                  "Error in connecting to the" 
                  " driver\n", 
                  __FILE__, __LINE__); 
  rc = SQLAllocStmt(hDbc, &hStmt); 
  CheckReturnCode(rc, hEnv, hDbc, SQL_NULL_HSTMT, 
                  "Unable to allocate a " 
                  "statement handle\n", 
                  __FILE__,__LINE__); 
    /*  Your application code here */ 
  if (hStmt != SQL_NULL_HSTMT) { 
    rc = SQLFreeStmt(hStmt, SQL_DROP); 
    CheckReturnCode(rc, hEnv, hDbc, hStmt, 
                    "Unable to free the " 
                    "statement handle\n", 
                    __FILE__, __LINE__); 
  } 
  if (hDbc != SQL_NULL_HDBC) { 
    rc = SQLDisconnect(hDbc); 
    CheckReturnCode(rc, hEnv, hDbc, 
                    SQL_NULL_HSTMT, 
                    "Unable to close the " 
                    "connection\n", 
                    __FILE__, __LINE__); 
    rc = SQLFreeConnect(hDbc); 
    CheckReturnCode(rc, hEnv, hDbc, 
                    SQL_NULL_HSTMT, 
                    "Unable to free the " 
                    "connection handle\n", 
                    __FILE__, __LINE__); 
  } 
  if (hEnv != SQL_NULL_HENV) { 
    rc = SQLFreeEnv(hEnv); 
    CheckReturnCode(rc, hEnv, SQL_NULL_HDBC, 
                         SQL_NULL_HSTMT, 
                         "Unable to free the "
                         "environment handle\n", 
                         __FILE__, __LINE__); 
  } 
} 
void CheckReturnCode(SQLRETURN rc, SQLHENV henv, 
                SQLHDBC hdbc, SQLHSTMT hstmt, 
                char* msg, char *filename, 
                int lineno) 
{ 
#define MSG_LNG 512 
  SQLCHAR     szSqlState[MSG_LNG]; 
             /* SQL state string */ 
  SQLINTEGER pfNativeError; 
             /* Native error code */ 
  SQLCHAR     szErrorMsg[MSG_LNG]; 
             /* Error msg text buffer pointer */ 
  SQLSMALLINT pcbErrorMsg; 
             /* Error msg text Available bytes */ 
  SQLRETURN   ret = SQL_SUCCESS; 
  if (rc != SQL_SUCCESS && 
      rc != SQL_NO_DATA_FOUND ) { 
    if (rc != SQL_SUCCESS_WITH_INFO) { 
      /* 
       * It's not just a warning 
      */ 
      fprintf(stderr, "*** ERROR in %s, line %d:" 
                      " %s\n", 
                      filename, lineno, msg); 
    } 
    /* 
     * Now see why the error/warning occurred 
    */ 
    while (ret == SQL_SUCCESS ||  
           ret == SQL_SUCCESS_WITH_INFO) { 
      ret = SQLError(henv, hdbc, hstmt, 
                     szSqlState, &pfNativeError, 
                     szErrorMsg, MSG_LNG, 
                     &pcbErrorMsg); 
      switch (ret) { 
        case SQL_SUCCESS: 
          fprintf(stderr, "*** %s\n" 
                  "*** ODBC Error/Warning = %s, " 
                  "TimesTen Error/Warning " 
                  " = %d\n", 
                  szErrorMsg, szSqlState, 
                  pfNativeError); 
          break; 
        case SQL_SUCCESS_WITH_INFO: 
          fprintf(stderr, "*** Call to SQLError" 
                  " failed with return code of " 
                  "SQL_SUCCESS_WITH_INFO.\n " 
                  "*** Need to increase size of" 
                  " message buffer.\n"); 
          break; 
        case SQL_INVALID_HANDLE: 
          fprintf(stderr, "*** Call to SQLError" 
                  " failed with return code of " 
                  "SQL_INVALID_HANDLE.\n"); 
          break; 
        case SQL_ERROR: 
          fprintf(stderr, "*** Call to SQLError" 
                  " failed with return code of " 
                  "SQL_ERROR.\n"); 
          break; 
        case SQL_NO_DATA_FOUND: 
          break; 
      } /* switch */ 
    } /* while */ 
}; 

プログラムでのデータ・ストア属性の設定

データ・ストアへの接続時に接続文字列を指定して、プログラムで接続属性を設定または上書きできます。

注意: TimesTenでOracleデータをキャッシュする場合、OracleID属性を「TimesTen ODBCの設定」ダイアログ・ボックスまたはODBC.INIファイルで設定する必要があります。接続されたクライアント間で混乱が発生しないように、プログラムでOracleIDを設定してください。TimesTenでのOracleデータのキャッシュの詳細は、『Oracle TimesTen Cache Connect to Oracle開発者および管理者ガイド』を参照してください。
BulkInsDataというデータ・ストアに接続し、デフォルトの行レベル・ロックではなくデータ・ストア・レベル・ロックがアプリケーションで使用されるように指定するには、次のコード・フラグメントに示すように、アプリケーションでSQLDriverConnectルーチンを使用します。 
SQLHDBC hdbc; 
SQLCHAR ConnStrOut[512]; 
SQLSMALLINT cbConnStrOut; 
SQLRETURN rc; 
rc = SQLDriverConnect(hdbc, NULL,  
     "DSN=BulkInsData;LockLevel=1", SQL_NTS,  
     ConnStrOut, sizeof (ConnStrOut),  
     &cbConnStrOut, SQL_DRIVER_NOPROMPT); 
注意: TimesTenデータ・ストアへの接続ごとに、多数のファイルがオープンします。つまり、多数のスレッドを使用し、スレッドごとに別々の接続を使用するアプリケーションでは、各スレッドに対して複数のファイルがオープンします。このようなアプリケーションでは、オペレーティング・システムで同時にオープンできるファイル記述子の最大数を超える可能性があります。この場合は、多数のオープン・ファイルを許可するようシステムを設定します。詳細は、『Oracle TimesTen In-Memory Database APIおよびSQLリファレンス・ガイド』のオープン・ファイルの数の制限に関する項を参照してください。